/**
 * 甲、乙、丙三位出海打鱼，随船带了21只箩筐。当晚返航时，他们发现有7个箩筐装满了鱼，
 * 还有7筐只装了半筐鱼，另外7筐则是空的。由于没有带秤，只好通过目测人为这7个满箩筐鱼的重量
 * 是相等的，7个半筐鱼的重量是相等的。在不将鱼倒出来的前提下，怎么将鱼和筐平分为三份？
 *
 *
 * 解题：
 * 根据题意：每个人应分到7个箩筐，其中有3.5筐的鱼。采用3X3数组a表示三个人分到的东西。
 * 其中。 每个人对应数据a的一行。
 * colum0 ： 分到鱼的整筐数  column1： 分到鱼的半筐数  column2： 分到的空筐数
 * 则：
 * 每行之或每列的和7
 * 对于每行： column0 + column1 = 3.5
 * column0 <=3
 * column1 >=1, 且为奇数
 *
 * 为避免出现重复分配： 规定第二个人的满筐数（半筐数）>= 第一个人的满筐数（半筐数）。
 */

#include <stdio.h>

int main()
{
    int a[3][3] ;

    int count = 0;

    printf("It exists possible distribution plans:\n");

    // 试探第一个人的满筐a[0][0]的值，满筐数不能>3
    for (int i = 0; i <= 3; i++)
    {
        a[0][0] = i;
        // 试探第二个人满筐a[1][0]的值，满筐数不能>3
        for (int j = i; j <= 7 - i && j <= 3; j++)
        {
            a[1][0] = j;
            // 第三人的满筐数>3
            if ((a[2][0] = 7 - a[1][0] - a[0][0]) > 3)
                continue;

            // 要求后一个人的满筐数>=前一个人，排除重复情况
            if (a[2][0] < a[1][0])
                break;

            // 试探半筐的值,半筐为奇数
            for (int k = 1; k <= 5; k += 2)
            {
                a[0][1] = k;
                for (int m = 1; m < 7 - k; m += 2)
                {
                    a[1][1] = m;
                    a[2][1] = 7 - k - m;
                    int flag = 1;
                    for (int n = 0; flag && n < 3; n++)
                    {
                        // 判断没人分到的鱼是否为3.5筐，flag为是否满足的标记变量

                        if ((a[n][0] + a[n][1]) < 7 && (7 == a[n][0] * 2 + a[n][1]))
                        {
                            a[n][2] = 7 - a[n][0] - a[n][1]; /*计算空筐数量*/
                        }
                        else
                            flag = 0;
                    }
                    if (flag)
                    {
                        printf("No.%d   Full basket Semi-basket Empty\n", ++count);
                        for (int n = 0; n < 3; n++)
                        {
                            printf("    fisher%c:   %d  %d  %d\n",
                                   'A' + n, a[n][0], a[n][1], a[n][2]);
                        }
                    }
                }
            }
        }
    }
}